/*仿写shell解释器*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/wait.h>

#define size 4096

int main(void)
{
	char buf[size];
	char* p = buf;
	pid_t pid;

	while(printf("%% ") && fgets(buf,size,stdin) != NULL)//不断地从键盘读取一行字符串，按ctrl+D结束
	{	
		/*去掉换行符'\n'*/
		while(*p != '\n')	p++;
		*p = '\0';
		p = buf;//字符指针重置回输入字符串的首字符

		/*创建子进程*/
		pid = fork();

		/*替换程序为shell命令程序*/
		char* argv[] = {buf,NULL};
		
		if(pid == 0)//如果是子进程
		{
			execvp(buf, argv);//替换子进程的内存映像
			printf("exec failed\n");//如果看到这句话，说明替换失败
			exit(1);
		}
		else if(pid > 0)//如果是父进程
		{
			wait(NULL);//给子进程收尸
		}
		else//如果创建失败
		{
			perror("fork");
			exit(1);
		}		
	}

	return 0;
}

